Universidade Federal da Paraíba
Urbanização no Brasil: de 31% em 1940 para 85,1% em 2014
Êxodo rural, industrialização e crescimento desordenado das metrópoles
Criação do Sistema Financeiro da Habitação (SFH) – Lei nº 4.380/1964
A partir de 1980, o SFH passou a ser impactado pelo aumento da inflação e pelas medidas adotadas pelos governos para contê-la
Em 1985, as prestações foram reajustadas em 112%, enquanto os saldos devedores subiram 246% com a inflação acumulada
O Plano Cruzado (1986) converteu o valor das prestações com base na média dos 12 meses anteriores e congelou os reajustes pelos 12 meses seguintes
Em 1987 e 1989, as prestações foram congeladas temporariamente pelo Plano Bresser e pelo Plano Verão, respectivamente
O Plano Collor I (1990), foi o que mais prejudicou o SFH
A crise econômica entre as décadas de 1980 e 1990 elevou a inadimplência no SFH de 9% em 1994 para 30% em 2005.
Uma das grandes vantagens é a interpretabilidade do modelo, em que é possível visualizar claramente as regras de decisão geradas
O processo de construção das árvores se baseia no particionamento recursivo do espaço dos preditores.
Cada particionamento é chamado de nó e o resultado final é chamado de folha ou nó terminal.
O espaço dos preditores é dividido em \(J\) regiões distintas e disjuntas denotadas por \(R_{1}, R_{2}, \cdots, R_{J}\).
\[ f\left(x\right) = \sum^{J}_{j=1}c_jI\left(x \in R_j \right), \]
\[ I_{R_j}(x) = \begin{cases} 1,& \text{se } x \in R_j \\ 0,& \text{se } x \notin R_j \end{cases}\text{.} \]
O estimador para a constante \(c_j\) é encontrado pelo método de mínimos quadrados:
\[ \sum_{x_i \in R_{j}} \left[y_i - f\left(x_i\right)\right]^2 \text{.} \qquad(1)\]
Como \(f\left(x_i\right)\) está sendo avaliado em um ponto específico \(x_i\) e as regiões são disjuntas, tem-se que \(f\left(x_i\right) = c_j\). Dessa forma, a Equação 1 se reduz a:
\[ \sum_{x_i \in R_j}\left[y_i - c_j\right]^2\text{.} \]
Derivando em relação a \(c_j\) e igualando a zero:
\[ \frac{\partial}{\partial c_j} \sum_{x_i \in R_j}\left(y_i - c_j\right)^2 = -2 \sum_{x_i \in R_j}\left(y_i - c_j\right) = 0\text{.} \]
Assim, chega-se ao estimador para \(c_j\):
\[ \hat{c}_j = \frac{1}{N_j}\sum_{x_i \in R_j} y_i\text{.} \]
Considerar todas as possíveis partições do espaço dos preditores é inviável devido ao alto custo computacional.
Dessa forma, utiliza-se a abordagem de divisão binária recursiva.
O processo inicia com a escolha de uma variável independente \(X_j\) e um ponto de corte \(s\) que proporcione a maior redução possível na soma dos quadrados dos resíduos. Isso define dois subconjuntos:
\[ R_{1}\left(j, s\right) = \{X|X_j \leq s\} \text{ e } R_{2}\left(j, s\right) = \{X|X_j > s\} \text{.} \]
\[ \min_{j, s}\left[\min_{c_1} \sum_{x_i \in R_1\left(j, s\right)} \left(y_i - c_{1}\right)^2 + \min_{c_2} \sum_{x_i \in R_2\left(j, s\right)} \left(y_i - c_{2}\right)^2\right]\text{,} \] em que \(c_1\) e \(c_2\) são as médias das respostas nas regiões \(R_1(j, s)\) e \(R_2(j, s)\), respectivamente.
O tamanho da árvore atua como um controle da complexidade do modelo:
Para lidar com isso, adota-se a estratégia de crescer inicialmente uma árvore grande \(T_0\), interrompendo as divisões apenas quando um número mínimo de observações por nó for alcançado.
Em seguida, realiza-se a poda da árvore com base no critério de custo-complexidade.
Para o processo de poda, define-se uma árvore qualquer \(T \subset T_{0}\) obtida a partir da poda de \(T_{0}\), isto é, colapsando o seus nós internos. Assim, define-se o critério de custo-complexidade:
\[ C_{\alpha}\left(T\right) = \sum^{|T|}_{j=1}N_jQ_j\left(T\right) + \alpha|T|\text{,} \] em que \(|T|\) é o número de folhas da árvore, \(Q_{j}\left(T\right)\) é a impureza do nó terminal \(j\), \(\alpha\) é o parâmetro que equilibra o tamanho da árvore e a adequação aos dados.
A busca pela subárvore \(T_{\alpha}\) é feita por meio do colapso sucessivo dos nós internos que causam o menor aumento em \(\sum_{j} N_j Q_j\left(T\right)\), até restar uma árvore com um único nó.
Esse processo gera uma sequência de subárvores, dentre as quais existe, para cada valor de \(\alpha\), uma única subárvore que minimiza \(C_{\alpha}\left(T\right)\).
A estimação de \(\alpha\) pode ser feita por validação cruzada, resultando na árvore final \(T_{\hat{\alpha}}\).
No caso da regressão, \(Q_j\left(T\right)\) pode representar o erro quadrático médio.
O algoritmo Bagging (Bootstrap Aggregating) foi introduzido por Breiman (1996).
Sua ideia central é gerar um estimador agregado a partir de múltiplas versões de um preditor, treinadas com amostras bootstrap do conjunto de treinamento.
O principal objetivo do Bagging é reduzir a variância de modelos, como as árvores de regressão, que tendem a variar muito quando treinadas isoladamente.
Ao combinar diversas árvores treinadas em subconjuntos distintos, o Bagging melhora a estabilidade e o desempenho preditivo do modelo final.
No caso de regressão, a predição do Bagging é obtida pela média das predições individuais de cada árvore.
Formalmente, seja \(\mathcal{L}\) o conjunto de treinamento. A partir dele, geram-se \(B\) amostras bootstrap \(\mathcal{L}^{(b)}\), cada uma usada para treinar uma árvore de regressão \(f(x, \mathcal{L}^{(b)})\).
A predição final agregada é dada por:
\[ f_{B}\left(x\right) = \frac{1}{B} \sum_{b = 1}^B f \left(x, \mathcal{L}^{\left(B\right)}\right)\text{,} \]
onde \(f_B(x)\) representa a predição média das \(B\) árvores.
No Boosting, não é necessário utilizar amostras bootstrap. Além disso, diferente do Bagging e Random Forest que constroem as árvores de forma paralela, o Boosting as constrói sequencialmente.
O objetivo é incorporar informações e corrigir os erros cometidos pelas árvores anteriores.
Passo 1 - Inicialização:
Passo 2 - Criação de \(B\) árvores (para \(b=1\) até \(B\)):
Passo 3 - Retorno do modelo final \[ \hat{f}\left(x\right) = \sum^{B}_{b=1}\lambda\hat{f}^{b}\left(x\right) \]
Os hiperparâmetros \(\lambda\) (taxa de aprendizado), \(B\) (número de árvores) e \(d\) (número de divisões por árvore) podem ser ajustados por meio de validação cruzada.
O processo de aprendizado do Boosting é mais lento, o que geralmente resulta em modelos mais precisos, embora mais custosos computacionalmente.
O processo de aprendizado é controlado pelo hiperparâmetro \(\lambda\). Valores menores de \(\lambda\) exigem um número maior de árvores \(B\) e, diferentemente do Bagging e da Random Forest, o Boosting pode sofrer sobreajuste caso sejam adicionadas muitas árvores ao modelo.
É comum utilizar árvores com menor profundidade (\(d\)), já que cada nova árvore depende das árvores já construídas (James et al. 2013).
Passo 1 - Inicialização: O algoritmo inicia ajustando uma árvore aos dados observados:
\[ f_0\left(x\right) = \arg \min_{\gamma} \sum_{i = 1}^N L\left(y_i, \gamma \right) \]
Passo 2 — Iterações (para \(m = 1\) até \(M\)):
Cont. (Passo 2)
Algumas implementações de Gradient Boosting, como o XGBoost e o LightGBM, utilizados neste trabalho, têm como foco principal a redução do custo computacional e a incorporação de técnicas de regularização para melhorar o desempenho e a generalização dos modelos.
Para tornar o algoritmo mais eficiente, destaca-se o Histogram-Based Algorithm, que busca os pontos de corte com menor custo computacional. Esse método discretiza os valores contínuos das variáveis em intervalo, semelhantes aos de um histograma, permitindo que as divisões nas árvores sejam feitas com base nesses intervalos, em vez de avaliar cada ponto individualmente. Essa abordagem reduz significativamente o custo computacional.
Além da maior eficiência computacional, técnicas de regularização L1 ou L2 podem ser incorporadas, a partir da seguinte função: \[ \mathcal{L}\left(\phi\right) = \sum_{i}L\left(y_{i}, f\left(x_i\right)\right) + \sum_{m}\Omega\left(f_{m}\left(x\right)\right)\text{, onde }\Omega\left(f\right) = \gamma T + \frac{1}{2}\lambda\|\omega\|^{2} \]
O Stacked Generalization (Stacking) é um método ensemble que combina as predições de vários modelos para treinar um novo estimador, com o objetivo de melhorar a precisão das predições.
A ideia central é atribuir pesos às predições dos modelos, dando mais importância àqueles com melhor desempenho, enquanto se evita atribuir altos pesos a modelos excessivamente complexos.
Matematicamente, o Stacking ajusta o modelo \(m = 1, \cdots, M\) ao conjunto de treinamento com a \(i\)-ésima observação removida, definindo predições \(\hat f_{m}^{-i}\left(x\right)\).
Os pesos são estimados por mínimos quadrados, resolvendo:
\[ \hat{w}^{st} = \arg \min_{w} \sum^{N}_{i = 1} \left[y_i - \sum^{M}_{m = 1} w_m \hat{f}^{-i}_m\left(x_i\right)\right]^2\text{.} \]
\[ \sum_{m}\hat{w}^{\text{st}}_{m}\hat{f}_{m}\left(x\right) \]
A obtenção de dados para o mercado imobiliário representa um desafio, devido à escassez de bases públicas organizadas.
Como alternativa, optou-se pela extração direta de informações de sites especializados utilizando a técnica conhecida como web scraping, com a coleta realizada em dois momentos distintos.
Em particular, as informações foram coletadas do Zap Imóveis.
O Zap Imóveis é uma das principais plataformas online de compra, venda e aluguel de imóveis no Brasil. Fundado em março de 2000, inicialmente recebeu o nome de Planeta Imóvel.
Possui uma base extensa de anúncios em diferentes cidades, incluindo João Pessoa, abrangendo imóveis novos e usados, residenciais e comerciais.
Sua ampla cobertura e variedade de informações o tornam uma fonte relevante para estudos de mercado e análise imobiliária.
Entre as informações disponíveis para coleta, destacam-se o preço do imóvel, a área, o número de quartos, o número de vagas de garagem, o endereço, o tipo de imóvel, o valor do condomínio e características adicionais, como piscina, academia, spa, entre outras.
O web scraping é uma técnica utilizada para extrair informações de sites da internet, armazenando-as em arquivos ou sistemas de banco de dados para fins de análise, desenvolvimento de aplicações ou acesso a informações de difícil obtenção.
A coleta dos dados é realizada por meio do Hypertext Transfer Protocol (HTTP),
Os métodos mais utilizados em web scraping são o GET e o POST:
O processo de web scraping normalmente se inicia com uma requisição GET para obter o conteúdo de uma página web.